package P7;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

/**
 * 假设有一个客户端/服务器程序，为了提高性能，该客户端/服务器程序使用 Java NIO 的非阻塞 IO 技术。
 * 现在需要编写一个客户端程序，用于向该服务器发送请求并接收响应；
 * 以及一个服务端程序，用于接收客户端请求并发送响应。要求必须实现以下功能：
 *
 * •客户端：
 * •创建 Socket，并连接到指定的服务器地址和端口。
 * •发送请求数据到服务器。
 * •接收服务器响应数据，并将其打印到控制台。
 *
 * •服务端
 * •创建服务器 Socket，并绑定到指定端口。
 * •创建 Selector，并将服务器 Socket 注册到 Selector 上。
 * •循环处理客户端请求，包括接收客户端连接、读取客户端请求数据、处理请求、发送响应数据。
 */
public class Client {
    private static final int BUFFER_SIZE = 1024;

    public static void main(String[] args) throws IOException {
        SocketChannel channel = SocketChannel.open(); // 创建 SocketChannel
        channel.configureBlocking(false); // 配置为非阻塞模式
        channel.connect(new InetSocketAddress("localhost", 8080)); // 连接服务器
        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); // 创建缓冲区
        while (true) {
            if (channel.finishConnect()) { // 如果连接成功，则发送请求数据
                String request = "Hello, server!";
                buffer.clear(); // 清空缓冲区
                buffer.put(request.getBytes());
                buffer.flip(); // 翻转缓冲区，准备写入数据
                while (buffer.hasRemaining()) {
                    channel.write(buffer); // 写入请求数据到服务器
                }
                buffer.clear(); // 清空缓冲区，准备读取响应数据
                while (channel.read(buffer) > 0) { // 读取响应数据
                    buffer.flip(); // 翻转缓冲区，准备读取数据
                    System.out.println(new String(buffer.array(), 0, buffer.limit())); // 打印响应数据到控制台
                    buffer.clear(); // 清空缓冲区，准备继续读取数据
                }
                break;
            }
        }
        channel.close(); // 关闭 SocketChannel
    }
}